import DoublyLinkedList from './doubly-linked-list';
/**
 * 基于双向链表的栈数据结构
 * 其实可以基于单向链表，不过需要调整一下具体的代码
 */
export default class StackLinkedList<T> {
    private _items: DoublyLinkedList<T>;

    constructor() {
        this._items = new DoublyLinkedList<T>();
    }
    /**
     * 向栈添加元素：添加一个（或几个）新元素到栈顶
     * @element 新元素
     */
    public push(element: T) {
        this._items.push(element);
    }
    /**
     * 从栈移除元素：移除栈顶的元素，同时返回被移除的元素
     */
    public pop(): T {
        return this._items.removeAt(this.size() - 1);
    }
    /**
     * 查看栈顶元素：返回栈顶的元素，不对栈做任何的修改
     */
    public peek(): T {
        const tail = this._items.getTail();
        if (tail != null) {
            return tail.element;
        }
        return undefined;
    }
    /**
     * 查看栈大小：返回栈里的元素个数
     */
    public size(): number {
        return this._items.size();
    }
    /**
     * 检查栈是否为空：如果栈里没有任何元素就返回true，否则返回false
     */
    public isEmpty(): boolean {
        return this._items.isEmpty();
    }
    /**
     * 清空栈元素：移除栈里的所有元素
     */
    public clear() {
        this._items.clear();
    }
    /**
     * 查看栈的字符串形式
     */
    public toString(): string {
        return this._items.toString();
    }
}
